home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
t_os
/
qa
/
akn_lib1.c
next >
Wrap
C/C++ Source or Header
|
1993-11-30
|
11KB
|
441 lines
// 茜CDPLAYER(試作版) ///// Tab Size : 4 /////
//
// akn_lib1.c v2.0 L21
//
// (C)K.Konishi 18-Jul-93
//
#define MAIN
#include "Platform.h"
#include "cd.h"
#include <EGB.h>
#include <MOS.h>
#include <CDRFRB.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <FMCFRB.h>
#include "aoi_lib2.h"
#define INIT_X 250
#define INIT_Y 150
#define LEN_X 270
#define LEN_Y 111
#define BUTTON_X 16
#define BUTTON_Y 16
// ON : 1 OFF : 0 aoi_lib1.hより
#define PAUSE 2
AOIbuttonData AbDc[BUTTON];
void _AKANEselectButtonDraw(short sx, short sy, short bx, short by)
{
short i;
for (i = 0; i < 12; i++) { // 曲番
AOIbuttonBase(sx + 5 + (i ? 4 : 0) + i * (bx + 1), sy + by * 5 + 10, (i == 0 || i == 11) ? bx + 4: bx, by);
}
}
void AKANECDbaseDraw(short sx, short sy, short lx, short ly, short bx, short by)
{
int i;
AOIwinBase(sx, sy, lx, ly, 1);
AOIbuttonBase(sx + 5, sy + 5, bx, by);
AOIbuttonBase(sx + 22, sy + 5, lx - 27, by);
AOIsystem12Font(sx + 36, sy + 7, BLACK, "CDPLAYER V2.0L21");
AOIboxFull(sx + 5, sy + by + 6, sx + 146, sy + by * 3 + 7, 8);
for (i = 0; i <= 1; i++) { // CD MIC のマーク vol
AOIbuttonBase(sx + 147, sy + by + 6 +(by + 1)*i, bx, by);
AOIbuttonBase(sx + 164, sy + by + 6 +(by + 1)*i, lx - 153 - bx, by);
}
AOIbuttonBase(sx + 5, sy + by * 3 + 8, lx - 10, by); // 曲目
_AKANEselectButtonDraw(sx, sy, bx, by); // 曲番
for (i = 0; i <= 1; i++) { // 特殊play
AOIbuttonBase(sx + 217, sy + by * 4 + 9 + i * (by + 1), 48, by);
}
for (i = 0; i < 7; i++) { // 操作キー
AOIbuttonBase(sx + 5 + ((i > 2) ? 23 : 0) + i * 27,
sy + by * 4 + 9, (i == 2) ? 49 : 26, by);
}
AOIsystem12Font(sx + 61, sy + 75, BLACK, "PLAY"); // ボタン描画
AOIsystem12Font(sx + 198, sy + 75, BLACK, "■");
AOIsystem12Font(sx + 11, sy + 75, BLACK, "<");
AOIsystem12Font(sx + 143, sy + 75, BLACK, ">");
AOIsystem12Font(sx + 116, sy + 75, BLACK, "≫");
AOIsystem12Font(sx + 170, sy + 75, BLACK, "∥");
AOIsystem12Font(sx + 218, sy + 92, BLACK, "RAND");
}
void AKANECDbuttonSet(void)
{
AOIsetButton(&AbDc[ 1], 5, 5, 16, 16);
AOIsetButton(&AbDc[ 2], 22, 5, 243, 16);
AOIsetButton(&AbDc[ 3], 147, 22, 16, 16);
AOIsetButton(&AbDc[ 4], 164, 22, 101, 16);
AOIsetButton(&AbDc[ 5], 147, 39, 16, 16);
AOIsetButton(&AbDc[ 6], 164, 39, 101, 16);
AOIsetButton(&AbDc[ 7], 5, 73, 26, 16);
AOIsetButton(&AbDc[ 8], 32, 73, 26, 16);
AOIsetButton(&AbDc[ 9], 59, 73, 49, 16);
AOIsetButton(&AbDc[10], 109, 73, 26, 16);
AOIsetButton(&AbDc[11], 136, 73, 26, 16);
AOIsetButton(&AbDc[12], 163, 73, 26, 16);
AOIsetButton(&AbDc[13], 190, 73, 26, 16);
AOIsetButton(&AbDc[14], 217, 73, 48, 16);
AOIsetButton(&AbDc[15], 5, 90, 20, 16);
AOIsetButton(&AbDc[16], 196, 90, 20, 16);
AOIsetButton(&AbDc[17], 217, 90, 48, 16);
AOIsetButton(&AbDc[18], 5, 22, 41, 33);
AOIsetButton(&AbDc[19], 47, 22, 100, 16);
AOIsetButton(&AbDc[20], 47, 39, 100, 16);
AOIsetButton(&AbDc[21], 26, 90, 16, 16);
AOIsetButton(&AbDc[22], 43, 90, 16, 16);
AOIsetButton(&AbDc[23], 60, 90, 16, 16);
AOIsetButton(&AbDc[24], 77, 90, 16, 16);
AOIsetButton(&AbDc[25], 94, 90, 16, 16);
AOIsetButton(&AbDc[26], 111, 90, 16, 16);
AOIsetButton(&AbDc[27], 128, 90, 16, 16);
AOIsetButton(&AbDc[28], 145, 90, 16, 16);
AOIsetButton(&AbDc[29], 162, 90, 16, 16);
AOIsetButton(&AbDc[30], 179, 90, 16, 16);
AOIsetButton(&AbDc[31], 5, 56, 260, 16);
}
void AKANEselectButton(short sx, short sy, short shift, short et, AOIbuttonData *Data)
{
short i, j = 1;
char str[10];
AOIstringData asD; // AOIstrData型の変数宣言
AOIbuttonData *Dt = Data; // AOIbuttonData型の変数宣言
if (et == 0) {
CDopen();
et = endtrk;
}
memoryShift = shift;
asD.sx = 12;
asD.sy = 12;
asD.ax = 6;
asD.ay = 12;
asD.sc = BLACK;
asD.ss = 0x01;
MOS_disp(0);
_AKANEselectButtonDraw(sx, sy, BUTTON_X, BUTTON_Y);
for (i = shift;
i < ((et > shift + 10) ? shift + 10 : et); i++) {
AOIstring(sx + Dt[20 + j].x + 2, sy + Dt[21].y + 15, &asD, _itoa(j + shift, str, 10));
j++;
}
MOS_disp(1);
}
int AKANEcdNowTimeDraw(short sx, short sy, char min, char sec, char frame, char nowPlayTimeDisplay)
{
short ret = 0;
char Dmin = 0;
char Dsec = 0;
char Dfrm = 0;
if (min == 0 && sec == 0 && frame == 0) {
ret = cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
if (ret != 0) {
CDinit();
}
} else {
nowtrktime.min = min;
nowtrktime.sec = sec;
nowtrktime.frame = frame;
nowdsktime.min = min;
nowdsktime.sec = sec;
nowdsktime.frame = frame;
}
if (nowPlayTimeDisplay == DSK) {
Dmin = nowdsktime.min;
Dsec = nowdsktime.sec;
Dfrm = nowdsktime.frame;
} else if (nowPlayTimeDisplay == TRK) {
Dmin = nowtrktime.min;
Dsec = nowtrktime.sec;
Dfrm = nowtrktime.frame;
}
AOIfigureDraw(sx + 60, sy + 40, (short)Dmin);
AOIfigureDraw(sx + 90, sy + 40, (short)Dsec - 2);
AOIfigureDraw(sx + 120, sy + 40, (short)Dfrm);
return ret;
}
void AKANEcdNowNoDraw(short sx, short sy, int memoryNowPlayNo)
{
int ret;
ret = cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
if (ret != 0) {
CDinit();
}
if (nowNo != memoryNowPlayNo) memoryNowPlayNo = nowNo;
else return;
AOIfigureDraw2(sx + 10, sy + 26, nowNo);
}
void AKANEfastNext(short sx, short sy)
{
int ch, mx, my;
long i = 0;
long j = 1;
short ret;
short music;
unsigned moji, encode;
struct TIMEADRS playTime;
char pat_work[258];
MOS_typeRom(37 + 1, 0, 0, pat_work); // マウスも変更
cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
ret = cdr_continue(driveno);
if ((ret & 0x108) != 0) { // 一時停止中ではない
if (status == 0) music = OFF; // 停止中
else music = ON; // 演奏中
} else { // 一時停止中
music = PAUSE;
cdr_pause(driveno);
}
if (music == OFF) return;
do {
MOS_rdpos(&ch, &mx, &my);
moji = KYB_read(1, &encode);
if (moji == 0x8009) ch = 1;
KYB_clrbuf();
nowdsktime.frame += j;
if (nowdsktime.frame > 70) {
nowdsktime.sec ++;
nowdsktime.frame = 0;
}
if (nowdsktime.sec > 59) {
nowdsktime.min++;
nowdsktime.sec =0;
}
AKANEcdNowTimeDraw(sx, sy, nowdsktime.min, nowdsktime.sec, nowdsktime.frame, nowPlayTimeDisplay);
if (i > 50) { // フレーム増加の間隔
i = 0;
j += 10; // 早送りのフレーム数
}
i++;
} while (ch == 1);
playTime.min = nowdsktime.min;
playTime.sec = nowdsktime.sec;
playTime.frame = nowdsktime.frame;
// printf("CDplayTime2呼び出しました%d %d %d", playTime.min, playTime.sec, playTime.frame);
CDplayTime(&playTime);
if (music == PAUSE) {
cdr_pause(driveno);
cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
AKANEcdNowTimeDraw(sx, sy, nowdsktime.min, nowdsktime.sec, nowdsktime.frame, nowPlayTimeDisplay);
}
}
Boolean AKANEcdplayWork(void)
{
short sx = INIT_X, sy = INIT_Y;
short lx = LEN_X, ly = LEN_Y;
short bx = BUTTON_X, by = BUTTON_Y;
int ch, mx, my;
int button = 0;
int i;
char endmark = 0;
short musicShift = 0;
char buttonLamp = OFF;
unsigned moji, encode;
char pat_work[258];
char dispTmp[(640/8)*480]; // ドットデータの読み書き作業領域
EGB_resolution(work, 0, 0x43);
AOIgetGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
AKANECDbaseDraw(sx, sy, lx, ly, bx, by);
AKANECDbuttonSet();
MOS_start(mwork, MosWorkSize);
MOS_disp(1);
MOS_typeRom(80 + 1, 0, 0, pat_work);
do {
MOS_rdpos(&ch, &mx, &my);
button = 0;
if (ch == 1) {
button = AOIbutton(sx, sy, mx, my, AbDc);
// printf("%d\r", button);
}
moji = KYB_read(1, &encode);
switch (moji) {
case 0x8006 :
button = 7;
break;
case 0x8007 :
button = 8;
break;
case 0x8008 :
button = 9;
break;
case 0x8009 :
AKANEfastNext(sx, sy);
break;
case 0x800a :
button = 11;
break;
case 0x800b :
button = 12;
break;
case 0x801d :
button = 13;
break;
case 0x31..0x39 : // 1~9
button = moji - 0x30 + 20;
break;
case 0x30 : // 0
button = 30;
break;
case 0x70 : // プレー p
button = 9;
break;
case 0x73 : // ストップ s
button = 13;
break;
case 0x6e : // ネクスト n
button = 11;
break;
case 0x62 : // バック b
button = 7;
break;
case 0x72 : // ランダム r
button = 17;
break;
case 0x6f : // 一時停止 o
button = 12;
break;
case 0x69 : // イントロ i
button = 14;
break;
case 0x74 : // タイム切り換え t
button = 20;
break;
case 0x2d : // ダイレクト選曲 - -
button = 15;
break;
case 0x2b : // ダイレクト選曲 + +
button = 16;
break;
case 0x1b : // 終了 ESC
button = 1;
break;
case 0x65 : // 終了 e
button = 1;
break;
case 0x68 : // 高速モード h
button = 40;
break;
case 0x6c : // 互換モード l
button = 41;
break;
}
KYB_clrbuf();
if (button > 0) { // ボタン反転
if (button != 18 && button != 19 && button != 20) {
AOIbuttonLamp(sx, sy, &AbDc[button]);
buttonLamp = ON;
MOS_typeRom(115 + 1, 0, 0, pat_work); // マウスも変更
if (button == 1) {
MOS_typeRom(124 + 1, 0, 0, pat_work);
}
}
}
if (memoryShift != musicShift) { // 前回と内容が変更あるとき
AKANEselectButton(sx, sy, musicShift, endtrk, AbDc);
}
AKANEcdNowTimeDraw(sx, sy, 0, 0, 0, nowPlayTimeDisplay);
AKANEcdNowNoDraw(sx, sy, memoryNowPlayNo);
// printf("\r%s", (status == 1) ? "演奏中" : "停止中");
switch (button) {
case 1 :
endmark = 1; // 終了条件設定
break;
case 2 :
// printf("移動");
AOIwindowMove(dispTmp, &sx, &sy, lx, ly);
break;
case 7 :
CDback();
break;
case 9 :
CDplay();
break;
case 10 :
AKANEfastNext(sx, sy);
break;
case 11 :
CDnext();
break;
case 12 :
CDpause();
break;
case 13 :
CDstop();
break;
case 15 :
if (musicShift > 0) musicShift -= 10;
for (i = 0; i < 100000; i++) ; // 時間調整
break;
case 16 :
if (musicShift < endtrk - 10) musicShift += 10;
for (i = 0; i < 100000; i++) ; // 時間調整
break;
case 17 :
CDplayNo(_AOIrandom(endtrk));
break;
case 20 :
if (nowPlayTimeDisplay == DSK) nowPlayTimeDisplay = TRK;
else if (nowPlayTimeDisplay == TRK) nowPlayTimeDisplay = DSK;
for (i = 0; i < 100000; i++) ; // 時間調整
break;
case 21..30 :
CDplayNo(button + musicShift - 20);
break;
case 40 :
_outp(0x05ec, 1);
break;
case 41 :
_outp(0x05ec, 0);
break;
}
if (buttonLamp == ON) { // ボタンの反転
if (button > 0) {
AOIbuttonLamp(sx, sy, &AbDc[button]);
buttonLamp = OFF;
MOS_typeRom(80 + 1, 0, 0, pat_work); // マウスも元通り
}
}
} while (endmark != 1);
MOS_end();
AOIputGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
return TRUE;
}